package com.cgq.service.impl;

import com.alibaba.fastjson.JSON;
import com.cgq.mapper.UserMapper;
import com.cgq.pojo.User;
import com.cgq.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * *  Author:陈国强
 * *  Description:
 * *  Date:2023/2/13 18:57
 */
@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper mapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //没有redis缓存效果，进行数据库的查询
    @Override
    public List<User> selectUserList(String name) {
        return mapper.findUsers(name);
    }


    //使用redis缓存效果，进行数据库的查询
    @Override
    public List<User> selectUserRedisList(String key) {
        //1.首先，进行第一次查询的时候，会先从redis中进行查询
        //先从redis 中取数据 如果redis 中有数据 表示缓存命中  直接返回redis 中的数据
//        List<User> users = (List<User>) redisTemplate.opsForValue().get("userList");
//        if(users!=null){
//            //缓存命中
//            System.out.println("缓存命中，不用查询数据库了");
//            return users;
//        }else{
//            //缓存没有命中
//            System.out.println("缓存没有命中，需要查询数据库");
//            List<User> users1 = mapper.findUsers();
//            // 把查询出来的数据 存入 redis 中
//          redisTemplate.opsForValue().set("userList",users1);
//          return users1;
        //}
        return isBlank(key) ? null : (List<User>) redisTemplate.opsForValue().get(key);
    }


    //使用stringredis缓存效果，进行数据库的查询
    @Override
    public List<User> selectUserStringRedisList() {
        //1.首先，进行第一次查询的时候，会先从redis中进行查询
        //先从redis 中取数据 如果redis 中有数据 表示缓存命中  直接返回redis 中的数据
        String userList = stringRedisTemplate.opsForValue().get("userList");
        if(userList!=null){
            //缓存命中
            System.out.println("缓存命中，不用查询数据库了");
            List<User> users = JSON.parseArray(userList, User.class);
            return users;
        }else{
            //缓存没有命中
            System.out.println("缓存没有命中，需要查询数据库");
            //List<User> users1 = mapper.findUsers();

            // 把查询出来的数据 存入 redis 中
            //stringRedisTemplate.opsForValue().set("userList", JSON.toJSONString(users1));

            //return users1;
            return null;
        }
    }

    //redis进行模糊查询
    @Override
    public List<User> selectUserRedisList1(Map<String, Object> params) {
        return null;
    }


    //关于redis进行模糊查询封装的工具类
    public boolean isBlank(String s) {
        int len;
        if (s != null && (len = s.length()) != 0) {
            for(int i = 0; i < len; ++i) {
                if (!Character.isWhitespace(s.charAt(i))) {
                    return false;
                }
            }
        }
        return true;
    }
}
